.\"
.\" SPDX-License-Identifier: BSD-2-Clause
.\"
.\" Copyright (c) 2025 Mateusz Piotrowski <0mp@FreeBSD.org>
.\"
.Dd July 14, 2025
.Dt DTRACE_PROFILE 4
.Os
.Sh NAME
.Nm dtrace_profile
.Nd a DTrace provider for firing probes at a given time interval
.Sh SYNOPSIS
.Nm profile Ns Cm :::profile- Ns Ar rate Ns Op Ar unit
.Nm profile Ns Cm :::tick- Ns Ar rate Ns Op Ar unit
.Sh DESCRIPTION
The
.Nm profile
provider implements three special probes related to the life cycle of the
DTrace program itself.
.Ss Probes
The
.Nm profile Ns Cm :::profile
probes fire on all CPUs and are suitable for measuring the whole system
periodically.
.Pp
The
.Nm profile Ns Cm :::tick
probes fire on a single CPU, potentially a different one every time.
They are useful, e.g., for printing partial results periodically.
.Ss Rate and Time Units
The
.Nm profile
provider probes will fire at the specified
.Ar rate .
.Pp
The default unit is
.Cm hz .
The
.Nm profile
provider supports the following time units:
.Bl -column -offset indent "ns, nsec" "Definition"
.It Sy Time Unit Ta Sy Definition
.It Cm ns , nsec Ta nanoseconds
.It Cm us , usec Ta microseconds
.It Cm ms , msec Ta milliseconds
.It Cm s , sec Ta seconds
.It Cm m , min Ta minutes
.It Cm h , hour Ta hours
.It Cm d , day Ta days
.It Cm hz Ta Hertz (frequency per second)
.El
.Ss Probe Arguments
The arguments of the
.Nm profile
provider probes
are:
.Bl -tag -width arg0
.It Va arg0
The PC (program counter) in the kernel when the probe triggered,
or 0 if the process was not in the kernel at that time.
.It Va arg1
The PC in the user process when the probe triggered,
or 0 if the process was in the kernel when the probe triggered.
.El
.Pp
Use arguments
.Va arg0
and
.Va arg1
to tell if the
.Nm profile
provider probe fired in the kernel or in the userspace context.
.Sh IMPLEMENTATION NOTES
The
.Xr sysctl 8
variable
.Va kern.dtrace.profile.aframes
controls the number of skipped artificial frames for
the
.Nm profile
provider.
.Sh EXAMPLES
.Ss Example 1 : Profiling On-CPU Kernel Stack Traces
The following DTrace one-liner uses the
.Nm profile
provider to collect stack traces over 60 seconds.
.\" XXX: Keep on one line for easier copy-pasting.
.Bd -literal -offset indent
dtrace -x stackframes=100 -n 'profile-197 /arg0/ {@[stack()] = count();} tick-60s {exit(0);}
.Ed
.Pp
The system is profiled at the 197 Hz to avoid sampling in lockstep
with other periodic activities.
This unnatural frequency minimizes the chance of overlapping with other events.
.Pp
Option
.Fl x Cm stackframes=100
increases the maximum number of kernel stack frames to unwind during
.Fn stack .
.Pp
Checking if
.Ar arg0
is not zero makes sure that profiling happens
when the program is in the kernel context.
.Pp
Refer to
.Lk https://www.brendangregg.com/flamegraphs.html
to learn about generating flame graphs from the obtained stack traces.
.Sh SEE ALSO
.Xr dtrace 1 ,
.Xr tracing 7
.Rs
.%B The illumos Dynamic Tracing Guide
.%O Chapter profile Provider
.%D 2008
.%U https://www.illumos.org/books/dtrace/chp-profile.html
.Re
.Rs
.%A Brendan Gregg
.%A Jim Mauro
.%B DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD
.%I Prentice Hall
.%P pp. 24\(en25
.%D 2011
.%U https://www.brendangregg.com/dtracebook/
.Re
.Sh AUTHORS
This manual page was written by
.An Mateusz Piotrowski Aq Mt 0mp@FreeBSD.org .
